#ifndef AACENCODER_H
#define AACENCODER_H
#include"mediabase.h"
extern "C" {
#include<libavcodec/avcodec.h>
}

class AACEncoder
{
public:
    AACEncoder();
    virtual ~AACEncoder();
    ///
    /// \brief init
    /// \param properties
    ///     sample_rate:采样率，默认48000
    ///     channels：通道数量，默认2
    ///     bit_rate:比特率，默认128*1024，即128KB
    ///     channel_layout：通道布局，默认根据channels获取
    /// \return
    ///
    RET_CODE init(const Properties &properties);
    ///
    /// \brief encode
    /// \param frame
    /// \param pts
    /// \param flush
    /// \param pktFrame
    /// \param ret
    /// \return
    ///
    /// fix me:逻辑不应该这样，应该拆分为 frame、packet。否则全部冗余在这个方法，使用 pkt_frame 来判断是哪个地方报错了，也太麻烦了。
    virtual AVPacket *encode(AVFrame *frame, const int64_t pts, int flush, int *pktFrame, RET_CODE *ret);

    RET_CODE getAdtsHeader(uint8_t *adtsHeader, int aacLength);

    virtual int getFormat() {
        return _ctx->sample_fmt;
    }
    virtual int getChannels() {
        return _ctx->channels;
    }
    virtual int getChannelLayout() {
        return _ctx->channel_layout;
    }
    // 一帧有多少个采样点【一个通道的采样点】
    virtual int getFrameSamples() {
        return _ctx->frame_size;
    }
    // 一帧占用的字节数
    virtual int getFrameBytes() {
        return av_get_bytes_per_sample(_ctx->sample_fmt) * _ctx->channels * _ctx->frame_size;
    }

    AVCodecContext *getCodecContext() {
        return _ctx;
    }

private:
    int _sample_rate = 48000;
    int _channels = 2;
    int _bit_rate = 128*1024;
    int _channel_layout = AV_CH_LAYOUT_STEREO;

    AVCodec *_codec = NULL;
    AVCodecContext *_ctx = NULL;



};

#endif // AACENCODER_H
